﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using ClienteSOAPServices.Persistencia;
using ClienteSOAPServices.Dominio;
using ClienteSOAPServices.Exceptions;
using System.Messaging;

namespace ClienteSOAPServices
{
    public class Clientes : IClientes
    {
        private ClienteDAO clienteDAO = null;
        private ClienteDAO ClienteDAO
        {
            get
            {
                if (clienteDAO == null)
                    clienteDAO = new ClienteDAO();
                return clienteDAO;
            }

        }

        public List<Cliente> ListarClientes()
        {
            return ClienteDAO.ListarTodos().ToList();
        }


        public Cliente ObtenerCliente(int codigo)
        {
            return ClienteDAO.Obtener(codigo);
        }

        public Cliente ObtenerClientePorNroDocumento(int NroDocumento)
        {
            return ClienteDAO.ObtenerClientePorNumeroDocumento(NroDocumento);
        }

        public Cliente CrearCliente(string ULogin, string password, Cliente clienteACrear)
        {
            SeguridadWS.SeguridadClient proxyU = new SeguridadWS.SeguridadClient();
            SeguridadWS.Usuario usuarioExiste = proxyU.ObtenerUsuarioPorULogin(ULogin);

            if (usuarioExiste != null)
            {
                ClienteException ex = new ClienteException { Message = "El Id de usuario " + ULogin + " ya existe. Por favor, ingrese un ID valido" };
                throw new FaultException<ClienteException>(ex, ex.Message);
            }

            Cliente dniExiste = ClienteDAO.ObtenerClientePorNumeroDocumento(clienteACrear.NumeroDocumento);

            if (dniExiste != null)
            {
                ClienteException ex = new ClienteException { Message = "El D.N.I. " + clienteACrear.NumeroDocumento + " ya existe." };
                throw new FaultException<ClienteException>(ex, ex.Message);
            }

            Cliente Clientecreado = ClienteDAO.Crear(clienteACrear);

            //Registra datos usuario
            SeguridadWS.Usuario usuario_ = new SeguridadWS.Usuario();
            usuario_.IdPersona = Clientecreado.IdCliente;
            usuario_.ULogin = ULogin;
            usuario_.Password = password;
            usuario_.Tipo = "CLNTE";

            proxyU.CrearUsuario(usuario_);

            return clienteACrear;
        }

        public Cliente ColaClienteRegistraPost(Cliente _clienteACrearCola)
        {

            try
            {
                // 1. Enviamos los datos de las clientes (In)
                string rutaColaIn = @".\private$\clientes";
                if (!MessageQueue.Exists(rutaColaIn))
                    MessageQueue.Create(rutaColaIn);
                MessageQueue colaIn = new MessageQueue(rutaColaIn);
                Message mensajeIn = new Message();
                mensajeIn.Label = "ColaClientes";
                mensajeIn.Body = new Cliente()
                {
                    Apellidos = _clienteACrearCola.Apellidos,
                    Nombres = _clienteACrearCola.Nombres,
                    RazonSocial = _clienteACrearCola.RazonSocial
                  ,
                    TipoDocumento = _clienteACrearCola.TipoDocumento,
                    NumeroDocumento = _clienteACrearCola.NumeroDocumento
                  ,
                    Email = _clienteACrearCola.Email,
                    Direccion = _clienteACrearCola.Direccion,
                    Telefono = _clienteACrearCola.Telefono
                  ,
                    FecNacimiento = _clienteACrearCola.FecNacimiento,
                    TipoCliente = _clienteACrearCola.TipoCliente
                };
                colaIn.Send(mensajeIn);
                return _clienteACrearCola;
            }
            catch
            {
                return null;
            }


        }


    }
}
